﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LJH.SmartAlarmSystem.UControls
{
    public partial class UCircle : Label
    {
        /// <summary>
        /// 存储矩形工作区域，用于计算路径
        /// </summary>
        Rectangle _clientRect;

        public UCircle()
        {
            InitializeComponent();

            #region 设置控件绘制样式标志
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);     // 忽略窗口消息，减少闪烁
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);    // 绘制到缓冲区，减少闪烁
            SetStyle(ControlStyles.UserPaint, true);                // 控件由其自身而不是操作系统绘制
            SetStyle(ControlStyles.ResizeRedraw, true);             // 控件调整其大小时重绘
            SetStyle(ControlStyles.SupportsTransparentBackColor, true); // 支持透明背景
            #endregion

            #region 设置默认样式
            _clientRect = this.ClientRectangle;
            this.BackColor = Color.Transparent;
            this.Size = new Size(50, 50);
            #endregion
        }

        #region 拓展属性 - 边框样式控制
        /// <summary>
        /// 获取或设置控件的边框粗细（单位：像素）。默认值为0，最小值为0。
        /// </summary>
        /// <remarks>
        /// 设置值小于0时会自动修正为0，修改后会触发控件重绘。
        /// </remarks>
        [DefaultValue(typeof(int), "0")]
        [Description("设置控件的边框粗细（单位：像素）")]
        public int BorderWidth
        {
            get { return _borderWidth; }
            set
            {
                _borderWidth = Math.Max(0, value);
                Invalidate();
            }
        }
        private int _borderWidth = 0;

        /// <summary>
        /// 获取或设置控件的边框颜色（支持RGB或命名颜色，如Color.Red）。默认值为Color.Gray。
        /// </summary>
        [DefaultValue(typeof(Color), "Gray")]
        [Description("设置控件的边框颜色（默认：灰色）")]
        public Color BorderColor
        {
            get { return _borderColor; }
            set
            {
                _borderColor = value;
                Invalidate();
            }
        }
        private Color _borderColor = Color.Gray;
        #endregion

        #region 属性重写 - 禁用文本和自动尺寸
        /// <summary>
        /// 重写Text属性，始终返回空字符串以避免文本显示。
        /// </summary>
        public override string Text { get => string.Empty; }

        /// <summary>
        /// 重写AutoSize属性，固定为false以保持控件尺寸手动可控。
        /// </summary>
        public override bool AutoSize { get => false; }
        #endregion

        #region 方法重写 - 绘图与尺寸调整
        /// <summary>
        /// 在控件尺寸变化时调整宽高比为1:1，并更新绘图区域。
        /// </summary>
        /// <param name="e">包含事件数据的EventArgs对象</param>
        /// <remarks>
        /// 强制控件保持正方形，并重新计算客户区矩形和区域。
        /// </remarks>
        protected override void OnSizeChanged(EventArgs e)
        {
            base.OnSizeChanged(e);
            this.Width = this.Height;
            _clientRect = this.ClientRectangle;
            this.Region = new Region(_clientRect);
            _clientRect.Width -= 1;
            _clientRect.Height -= 1;
        }

        /// <summary>
        /// 执行控件的自定义绘制逻辑，绘制圆形边框和前景色填充。
        /// </summary>
        /// <param name="e">提供绘图上下文的PaintEventArgs对象</param>
        /// <remarks>
        /// 绘制顺序：
        /// 1. 若边框宽度>0，先绘制边框颜色的圆形
        /// 2. 根据边框宽度计算内圆区域
        /// 3. 使用ForeColor填充内圆
        /// 使用HighQuality平滑模式确保图形抗锯齿。
        /// </remarks>
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics g = e.Graphics;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            // 画圆
            Rectangle borderRect = new Rectangle(_clientRect.Left + 1, _clientRect.Top + 1, _clientRect.Width - 2, Height - 2);
            Rectangle backgroundRect = borderRect;
            
            if (_borderWidth > 0)
            {
                using (SolidBrush borderBursh = new SolidBrush(_borderColor))
                {
                    g.FillEllipse(borderBursh, borderRect); //填充边框
                }
                backgroundRect = new Rectangle(_clientRect.X + _borderWidth, _clientRect.Y + _borderWidth,
                    _clientRect.Width - 2 * _borderWidth, _clientRect.Height - 2 * _borderWidth);
            }

            using (var foregroundBrush = new SolidBrush(this.ForeColor))
            {
                g.FillEllipse(foregroundBrush, backgroundRect); //填充背景
            }
        }
        #endregion
    }
}
